package com.one.group.admin.mapper;

import com.mybatisflex.core.BaseMapper;
import com.one.group.model.dto.OwnerQueryDto;
import com.one.group.model.dto.OwnerSearchVo;
import com.one.group.model.entity.Owner;
import com.one.group.model.vo.OwnerListVo;
import org.apache.ibatis.annotations.MapKey;

import java.util.List;
import java.util.Map;

public interface OwnerMapper extends BaseMapper<Owner> {

    /**
     *  添加业主
     * @param owner
     * @return 新增业主ID
     */
    int addOwner(Owner owner);

    /**
     * 查询业主列表
     * @param ownerQueryDto 查询条件
     * @return 业主列表
     */
    List<OwnerListVo> findOwnerByQueryDto(OwnerQueryDto ownerQueryDto);

    /**
     * 迁出业主
     * @param houseId 房屋ID
     * @return 操作结果
     */
    boolean moveOutOwner(Long houseId);

    /**
     * 批量迁出业主
     * @param houseIds 房屋ID列表
     * @return 操作结果
     */
    boolean moveOutOwnerBatch(List<Long> houseIds);

    /**
     * 根据房屋ID获取业主ID
     * @param houseId 房屋ID
     * @return 业主ID
     */
    Long getOwnerIdByHouseId(Long houseId);

    /**
     * 更新业主状态
     * @param params 参数Map，包含ownerId和status
     * @return 操作结果
     */
    boolean updateOwnerStatus(Map<String, Object> params);

    /**
     * 批量更新业主状态
     * @param ownerIds 业主ID列表
     * @param status 状态
     * @return 操作结果
     */
    boolean updateOwnerStatusBatch(List<Long> ownerIds, Integer status);

    /**
     * 更新房屋的业主ID
     * @param ownerId 业主ID
     * @param houseId 房屋ID
     * @return 操作结果
     */
    boolean updateHouseOwnerId(Long ownerId, Long houseId);

    /**
     * 更新业主状态和迁入时间
     * @param ownerId 业主ID
     * @param moveInTime 迁入时间
     * @return 操作结果
     */
    boolean updateOwnerMoveInStatus(Long ownerId, java.util.Date moveInTime);
    /**
     * 根据ID查询业主信息
     * @param payerId 业主ID
     * @return 业主信息
     */
    Owner mySelectOneById(Long payerId);

    /**
     * 根据业主ID列表查询业主状态
     * @param ownerIds 业主ID列表
     * @return 业主状态列表
     */
    List<Integer> getOwnerStatusByIds(List<Long> ownerIds);

    /**
     * 根据楼栋名称、单元名称、房号查询房屋ID
     * @param buildingName 楼栋名称
     * @param unitName 单元名称
     * @param number 房号
     * @param tenantId 租户ID
     * @return 房屋ID
     */
    Long getHouseIdByBuildingUnitNumber(String buildingName, String unitName, String number, Long tenantId);

    /**
     * 根据租户ID获取所有小区
     * @param tenantId 租户ID
     * @return 小区列表
     */
    @MapKey("id")
    List<Map<String, Object>> getAllCellsByTenantId(Long tenantId);

    /**
     * 批量更新业主状态和时间
     * @param ownerIds 业主ID列表
     * @param status 状态
     * @return 操作结果
     */
    boolean updateOwnerStatusAndTimeBatch(List<Long> ownerIds, Integer status);

    /**
     * 根据ID获取业主状态
     * @param id 业主ID
     * @param tenantId 租户ID
     * @return 业主状态
     */
    int getStatusById(Long id, Long tenantId);

    /**
     * 根据业主名字模糊查询获取业主ID列表
     * @param ownerName 业主名字（支持模糊查询）
     * @param tenantId 租户ID
     * @return 业主ID列表
     */
    List<OwnerSearchVo> getOwnerIdsByName(String ownerName, Long tenantId);

    Long getIdByUserId(Long userId);

    String getEmailByOwnerId(Long ownerId);
}
